/**
 * Classe encarregada de criar objetos do tipo cantil, cada objeto criado
 * tem caracteristicas de ter um liquido, um limite e um quantidade de agua, alem 
 * de caracteristicas herdadas da super classe Utilitario. Ao criar um objeto
 * poderá ser carregado qualquer tipo de liquido no mesmo, retirado ou colocado.
 */
package rpg.recurso;

/**
 * @author Douglas
 * @since 26/01/13
 * @version 0.5
 */
public class Cantil extends Utilitario {

    /*
     * Atributos
     */
    private Liquido liquido;
    private int limite;
    private int quantidadeDeLiquido;

    /**
     * Método construtor da classe.
     *
     * @param nome
     * @param quantidade
     * @param limite
     * @param funcao
     */
    public Cantil(String nome, int quantidade, int limite, String funcao) {
        super(nome, funcao, quantidade);
        setLimite(limite);
    }

    /*
     * Encapsulamento dos atributos.
     */
    public Liquido getLiquido() {
        return liquido;
    }

    public int getLimite() {
        return limite;
    }

    public void setLimite(int limite) {
        this.limite = limite;
    }

    public int getQuantidadeDeLiquido() {
        if (quantidadeDeLiquido < 0) {
            quantidadeDeLiquido = 0;

        }
        if (quantidadeDeLiquido > limite) {
            quantidadeDeLiquido = limite;

        }
        return quantidadeDeLiquido;
    }
    
    public void setQuantidadeDeLiquido(int quantidadeDeLiquido) {
        this.quantidadeDeLiquido = quantidadeDeLiquido;
    }

    /**
     * Metodo recebe agua por meio de um parametro do Tipo local, verifica se
     * este local possui agua, e se o cantil não esta cheio, caso tenha estas
     * duas condições ele entra em um loop enchendo o cantil 1 a um, até chegar
     * em seu limite.
     *
     * @param local
     * @return mensagem ao usuario
     */
    public String receber(Liquido liquido) {
        String mensagem = "";
        int cont = 0;
        if (verificaEstado(liquido)) {
            this.liquido = liquido;
            while (getQuantidadeDeLiquido() != limite && liquido.disponivel()) {
                setQuantidadeDeLiquido(getQuantidadeDeLiquido() + 1);
                liquido.setQuantidade(liquido.getQuantidade() - 1);
                cont++;
            }
            mensagem = "Recebendo liquido no cantil (" + cont + " Litros)";
        } else {
            mensagem += "Impossivel receber o liquido, pois o mesmo nao possui condições"
                    + "de uso!";
        }

        return mensagem;
    }

    /**
     * Metodo retirar, retira uma quantidade de liquido do cantil, esta
     * quantidade é 1, caso o cantil esteja vazil o usuario sera avisado.
     *
     * @return mensagem se foi possivel retirar
     */
    public String retirar(int quantidade) {
        String mensagem = "";
        if (getQuantidadeDeLiquido() != 0 || liquido != null) {
            mensagem += "Retirando " + quantidade + " litros de liquido do cantil";
            setQuantidadeDeLiquido(getQuantidadeDeLiquido() - quantidade);
        } else {
            mensagem += "Impossivel retirar liquido do cantil, ele esta vazio!";
        }

        return mensagem;
    }

    /**
     * Testa o liquido, e retorna se o liquido esta em estado de consumo ou não,
     * sendo true para consumivel, e false para não consumivel.
     *
     * @param liquido
     * @return true se o liquido e consumivel, e false se não é
     */
    public boolean verificaEstado(Liquido liquido) {
        if (!liquido.getEstado().equals(Estado.Ruim)) {
            return true;
        } else {
            return false;
        }
    }
}
